home *** CD-ROM | disk | FTP | other *** search
/ Network PC / Network PC.iso / amiga utilities / communication / bbs / termv4.6 / extras / source / term-source.lha / ASCIIPanel.c < prev    next >
Encoding:
C/C++ Source or Header  |  1996-03-18  |  8.7 KB  |  440 lines

  1. /*
  2. **    ASCIIPanel.c
  3. **
  4. **    User interface for built-in ASCII transfer routines
  5. **
  6. **    Copyright © 1990-1996 by Olaf `Olsen' Barthel
  7. **        All Rights Reserved
  8. */
  9.  
  10. #ifndef _GLOBAL_H
  11. #include "Global.h"
  12. #endif
  13.  
  14. enum    {    GAD_BYTES=1000,GAD_INFORMATION,GAD_CHARDELAY,GAD_LINEDELAY,
  15.         GAD_PACING,GAD_QUIET_TRANSFER,GAD_SKIP,GAD_ABORT
  16.     };
  17.  
  18. STATIC struct LayoutHandle    *ASCIIHandle;
  19. STATIC struct List         MessageList;
  20. STATIC LONG             MessageCount;
  21.  
  22. struct Window *
  23. CreateASCIIWindow(BOOL Send)
  24. {
  25.     struct IBox Bounds;
  26.  
  27.     NewList(&MessageList);
  28.  
  29.     MessageCount = 0;
  30.  
  31.     if(ASCIIHandle = LT_CreateHandleTags(Window -> WScreen,
  32.         LH_LocaleHook,    &LocaleHook,
  33.     TAG_DONE))
  34.     {
  35.         struct Window *PanelWindow;
  36.  
  37.         LT_New(ASCIIHandle,
  38.             LA_Type,    VERTICAL_KIND,
  39.         TAG_DONE);
  40.         {
  41.             LT_New(ASCIIHandle,
  42.                 LA_Type,    VERTICAL_KIND,
  43.                 LA_LabelID,    MSG_V36_0000,
  44.             TAG_DONE);
  45.             {
  46.                 LT_New(ASCIIHandle,
  47.                     LA_Type,        BOX_KIND,
  48.                     LA_ID,            GAD_BYTES,
  49.                     LABX_FirstLabel,    MSG_ASCIIPANEL_BYTES_GAD,
  50.                     LABX_LastLabel,        MSG_ASCIIPANEL_LINES_GAD,
  51.                     LABX_ReserveSpace,    TRUE,
  52.                     LA_Chars,        50,
  53.                 TAG_DONE);
  54.  
  55.                 LT_New(ASCIIHandle,
  56.                     LA_Type,        LISTVIEW_KIND,
  57.                     LA_LabelID,        MSG_ASCIIPANEL_INFORMATION_GAD,
  58.                     LA_LabelPlace,        PLACE_LEFT,
  59.                     LA_ID,            GAD_INFORMATION,
  60.                     LA_Lines,        2,
  61.                     LALV_MaxGrowX,        70,
  62.                     LALV_MaxGrowY,        10,
  63.                     LALV_CursorKey,        TRUE,
  64.                     GTLV_ReadOnly,        TRUE,
  65.                     GTLV_Labels,        &MessageList,
  66.                 TAG_DONE);
  67.  
  68.                 LT_EndGroup(ASCIIHandle);
  69.             }
  70.  
  71.             if(Send)
  72.             {
  73.                 LT_New(ASCIIHandle,
  74.                     LA_Type,        VERTICAL_KIND,
  75.                     LA_LabelID,        MSG_V36_0003,
  76.                     LAGR_LastAttributes,    TRUE,
  77.                 TAG_DONE);
  78.                 {
  79.                     LT_New(ASCIIHandle,
  80.                         LA_Type,        SliderType,
  81.                         LA_LabelID,        MSG_ASCIIPANEL_CHAR_DELAY_GAD,
  82.                         LA_ID,            GAD_CHARDELAY,
  83.                         GTSL_Min,        0,
  84.                         GTSL_Max,        10 * 100,
  85.                         LA_WORD,        &Config -> TransferConfig -> CharDelay,
  86.                         GTSL_LevelFormat,    "%s s",
  87.                         GTSL_DispFunc,        StandardShowTime,
  88.                     TAG_DONE);
  89.  
  90.                     LT_New(ASCIIHandle,
  91.                         LA_Type,        SliderType,
  92.                         LA_LabelID,        MSG_ASCIIPANEL_LINE_DELAY_GAD,
  93.                         LA_ID,            GAD_LINEDELAY,
  94.                         GTSL_Min,        0,
  95.                         GTSL_Max,        10 * 100,
  96.                         LA_WORD,        &Config -> TransferConfig -> LineDelay,
  97.                         GTSL_LevelFormat,    "%s s",
  98.                         GTSL_DispFunc,        StandardShowTime,
  99.                     TAG_DONE);
  100.  
  101.                     LT_New(ASCIIHandle,
  102.                         LA_Type,        CYCLE_KIND,
  103.                         LA_LabelID,        MSG_ASCIIPANEL_TEXT_PACING_GAD,
  104.                         LA_ID,            GAD_PACING,
  105.                         LA_UBYTE,        &Config -> TransferConfig -> PacingMode,
  106.                         LACY_FirstLabel,    MSG_ASCIIPANEL_DIRECT_TXT,
  107.                         LACY_LastLabel,        MSG_ASCIIPANEL_KEYDELAY_TXT,
  108.                     TAG_DONE);
  109.  
  110.                     LT_New(ASCIIHandle,
  111.                         LA_Type,        CHECKBOX_KIND,
  112.                         LA_LabelID,        MSG_ASCIIPANEL_QUIET_TRANSFER_GAD,
  113.                         LA_ID,            GAD_QUIET_TRANSFER,
  114.                         LA_BYTE,        &Config -> TransferConfig -> QuietTransfer,
  115.                     TAG_DONE);
  116.  
  117.                     LT_EndGroup(ASCIIHandle);
  118.                 }
  119.  
  120.                 LT_New(ASCIIHandle,
  121.                     LA_Type,VERTICAL_KIND,
  122.                 TAG_DONE);
  123.                 {
  124.                     LT_New(ASCIIHandle,
  125.                         LA_Type,    XBAR_KIND,
  126.                         LAXB_FullSize,    TRUE,
  127.                     TAG_DONE);
  128.  
  129.                     LT_EndGroup(ASCIIHandle);
  130.                 }
  131.  
  132.                 LT_New(ASCIIHandle,LA_Type,HORIZONTAL_KIND,
  133.                     LAGR_SameSize,    TRUE,
  134.                     LAGR_Spread,    TRUE,
  135.                 TAG_DONE);
  136.                 {
  137.                     LT_New(ASCIIHandle,
  138.                         LA_Type,    BUTTON_KIND,
  139.                         LA_LabelID,    MSG_TRANSFERPANEL_SKIP_CURRENT_FILE_GAD,
  140.                         LA_ID,        GAD_SKIP,
  141.                         LABT_ExtraFat,    TRUE,
  142.                     TAG_DONE);
  143.  
  144.                     LT_New(ASCIIHandle,
  145.                         LA_Type,    BUTTON_KIND,
  146.                         LA_LabelID,    MSG_TRANSFERPANEL_ABORT_ENTIRE_TRANSFER_GAD,
  147.                         LA_ID,        GAD_ABORT,
  148.                         LABT_ExtraFat,    TRUE,
  149.                     TAG_DONE);
  150.  
  151.                     LT_EndGroup(ASCIIHandle);
  152.                 }
  153.             }
  154.             else
  155.             {
  156.                 LT_New(ASCIIHandle,
  157.                     LA_Type,    VERTICAL_KIND,
  158.                 TAG_DONE);
  159.                 {
  160.                     LT_New(ASCIIHandle,LA_Type,XBAR_KIND,LAXB_FullSize,TRUE,TAG_DONE);
  161.  
  162.                     LT_EndGroup(ASCIIHandle);
  163.                 }
  164.  
  165.                 LT_New(ASCIIHandle,
  166.                     LA_Type,    HORIZONTAL_KIND,
  167.                 TAG_DONE);
  168.                 {
  169.                     LT_New(ASCIIHandle,
  170.                         LA_Type,    BUTTON_KIND,
  171.                         LA_LabelID,    MSG_TRANSFERPANEL_ABORT_ENTIRE_TRANSFER_GAD,
  172.                         LA_ID,        GAD_ABORT,
  173.                         LABT_ExtraFat,    TRUE,
  174.                     TAG_DONE);
  175.  
  176.                     LT_EndGroup(ASCIIHandle);
  177.                 }
  178.             }
  179.  
  180.             LT_EndGroup(ASCIIHandle);
  181.         }
  182.  
  183.         Bounds . Left    = WindowLeft + Window -> LeftEdge;
  184.         Bounds . Top    = WindowTop + Window -> TopEdge;
  185.         Bounds . Width    = WindowWidth;
  186.         Bounds . Height    = WindowHeight;
  187.  
  188.         if(PanelWindow = LT_Build(ASCIIHandle,
  189.             LAWN_TitleText,        Send ? LocaleString(MSG_ASCIIPANEL_SENDING_TXT) : LocaleString(MSG_ASCIIPANEL_RECEIVING_TXT),
  190.             LAWN_Bounds,        &Bounds,
  191.             LAWN_IDCMP,        IDCMP_CLOSEWINDOW,
  192.             LAWN_HelpHook,        &GuideHook,
  193.             WA_DepthGadget,        TRUE,
  194.             WA_CloseGadget,        TRUE,
  195.             WA_DragBar,        TRUE,
  196.             WA_RMBTrap,        TRUE,
  197.             WA_SimpleRefresh,    TRUE,
  198.         TAG_DONE))
  199.         {
  200.             ULONG    IntuiLock = LockIBase(NULL);
  201.             LONG    Move;
  202.             BOOL    Activate;
  203.  
  204.             GuideContext(CONTEXT_ASCII);
  205.  
  206.             if(Config -> MiscConfig -> AlertMode == ALERT_SCREEN || Config -> MiscConfig -> AlertMode == ALERT_BEEP_SCREEN)
  207.                 Move = Activate = TRUE;
  208.             else
  209.             {
  210.                 if(IntuitionBase -> ActiveScreen == PanelWindow -> WScreen)
  211.                     Activate = TRUE;
  212.                 else
  213.                     Activate = FALSE;
  214.             }
  215.  
  216.             UnlockIBase(IntuiLock);
  217.  
  218.             if(Move)
  219.             {
  220.                 if(PanelWindow -> WScreen -> LeftEdge > 0)
  221.                 {
  222.                     if(PanelWindow -> WScreen -> TopEdge > 0)
  223.                         MoveScreen(PanelWindow -> WScreen,-PanelWindow -> WScreen -> LeftEdge,-PanelWindow -> WScreen -> TopEdge);
  224.                     else
  225.                         MoveScreen(PanelWindow -> WScreen,-PanelWindow -> WScreen -> LeftEdge,0);
  226.                 }
  227.                 else
  228.                 {
  229.                     if(PanelWindow -> WScreen -> TopEdge > 0)
  230.                         MoveScreen(PanelWindow -> WScreen,0,-PanelWindow -> WScreen -> TopEdge);
  231.                 }
  232.  
  233.                 WindowToFront(PanelWindow);
  234.  
  235.                 ScreenToFront(PanelWindow -> WScreen);
  236.             }
  237.  
  238.             if(Activate)
  239.                 ActivateWindow(PanelWindow);
  240.  
  241.             PushWindow(PanelWindow);
  242.  
  243.             return(PanelWindow);
  244.         }
  245.  
  246.         LT_DeleteHandle(ASCIIHandle);
  247.  
  248.         ASCIIHandle = NULL;
  249.     }
  250.  
  251.     return(NULL);
  252. }
  253.  
  254. VOID
  255. DeleteASCIIWindow(struct Window *Window,BOOL WaitForIt)
  256. {
  257.     if(WaitForIt && Window && ASCIIHandle)
  258.     {
  259.         struct IntuiMessage    *Message;
  260.         BOOL             Done = FALSE;
  261.         ULONG             MsgClass;
  262.         struct Gadget        *MsgGadget;
  263.         LONG             i;
  264.  
  265.         for(i = GAD_CHARDELAY ; i <= GAD_SKIP ; i++)
  266.             LT_SetAttributes(ASCIIHandle,i,GA_Disabled,TRUE,TAG_DONE);
  267.  
  268.         do
  269.         {
  270.             if(Wait(PORTMASK(Window -> UserPort) | SIG_BREAK) & SIG_BREAK)
  271.                 break;
  272.  
  273.             while(Message = (struct IntuiMessage *)LT_GetIMsg(ASCIIHandle))
  274.             {
  275.                 MsgClass    = Message -> Class;
  276.                 MsgGadget    = (struct Gadget *)Message -> IAddress;
  277.  
  278.                 LT_ReplyIMsg(Message);
  279.  
  280.                 if(MsgClass == IDCMP_CLOSEWINDOW || (MsgClass == IDCMP_GADGETUP && MsgGadget -> GadgetID == GAD_ABORT))
  281.                     Done = TRUE;
  282.             }
  283.         }
  284.         while(!Done);
  285.     }
  286.  
  287.     if(Window && ASCIIHandle)
  288.         PopWindow();
  289.  
  290.     if(ASCIIHandle)
  291.     {
  292.         LT_DeleteHandle(ASCIIHandle);
  293.  
  294.         ASCIIHandle = NULL;
  295.     }
  296.  
  297.     if(MessageCount)
  298.     {
  299.         FreeList(&MessageList);
  300.  
  301.         MessageCount = 0;
  302.     }
  303. }
  304.  
  305. VOID __stdargs
  306. AddASCIIMessage(struct Window *Window,STRPTR Message,...)
  307. {
  308.     STATIC UBYTE     TempBuffer[256];
  309.  
  310.     struct Node    *Node;
  311.     va_list         VarArgs;
  312.  
  313.     va_start(VarArgs,Message);
  314.     VSPrintf(TempBuffer,Message,VarArgs);
  315.     va_end(VarArgs);
  316.  
  317.     if(Node = CreateNode(TempBuffer))
  318.     {
  319.         if(MessageCount == 100)
  320.         {
  321.             FreeVecPooled(RemHead(&MessageList));
  322.  
  323.             MessageCount = 99;
  324.         }
  325.  
  326.         LT_SetAttributes(ASCIIHandle,GAD_INFORMATION,
  327.             GTLV_Labels,~0,
  328.         TAG_DONE);
  329.  
  330.         AddTail(&MessageList,Node);
  331.  
  332.         LT_SetAttributes(ASCIIHandle,GAD_INFORMATION,
  333.             GTLV_Labels,        &MessageList,
  334.             GTLV_Top,        MessageCount,
  335.             GTLV_MakeVisible,    MessageCount,
  336.         TAG_DONE);
  337.  
  338.         MessageCount++;
  339.     }
  340. }
  341.  
  342. VOID
  343. UpdateASCIIWindow(struct Window *Window,LONG Bytes,LONG MaxBytes,LONG Lines)
  344. {
  345.     if(Bytes != -1)
  346.     {
  347.         UBYTE LocalBuffer[40];
  348.  
  349.         if(MaxBytes)
  350.         {
  351.             LONG Percent = (100 * Bytes) / MaxBytes;
  352.  
  353.             if(Percent > 100)
  354.                 Percent = 100;
  355.  
  356.             if(LocaleBase)
  357.                 SPrintf(LocalBuffer,"%lD (%ld%%)",Bytes,Percent);
  358.             else
  359.                 SPrintf(LocalBuffer,"%ld (%ld%%)",Bytes,Percent);
  360.         }
  361.         else
  362.             SPrintf(LocalBuffer,ConvNumber,Bytes);
  363.  
  364.         LT_SetAttributes(ASCIIHandle,GAD_BYTES,
  365.             LABX_Index,    0,
  366.             LABX_Text,    LocalBuffer,
  367.         TAG_DONE);
  368.     }
  369.  
  370.     if(Lines != -1)
  371.     {
  372.         UBYTE LocalBuffer[40];
  373.  
  374.         SPrintf(LocalBuffer,ConvNumber,Lines);
  375.  
  376.         LT_SetAttributes(ASCIIHandle,GAD_BYTES,
  377.             LABX_Index,    1,
  378.             LABX_Text,    LocalBuffer,
  379.         TAG_DONE);
  380.     }
  381. }
  382.  
  383. BOOL
  384. HandleASCIIWindow()
  385. {
  386.     struct IntuiMessage    *Message;
  387.     ULONG             MsgClass;
  388.     struct Gadget        *MsgGadget;
  389.  
  390.     while(Message = (struct IntuiMessage *)LT_GetIMsg(ASCIIHandle))
  391.     {
  392.         MsgClass    = Message -> Class;
  393.         MsgGadget    = (struct Gadget *)Message -> IAddress;
  394.  
  395.         LT_ReplyIMsg(Message);
  396.  
  397.         if(MsgClass == IDCMP_CLOSEWINDOW)
  398.             return(1);
  399.  
  400.         if(MsgClass == IDCMP_MOUSEMOVE)
  401.         {
  402.             SendSetup();
  403.  
  404.             ConfigChanged = TRUE;
  405.         }
  406.  
  407.         if(MsgClass == IDCMP_GADGETUP)
  408.         {
  409.             switch(MsgGadget -> GadgetID)
  410.             {
  411.                 case GAD_PACING:
  412.                 case GAD_CHARDELAY:
  413.                 case GAD_LINEDELAY:
  414.  
  415.                     ASCIISendSetup();
  416.  
  417.                     ConfigChanged = TRUE;
  418.  
  419.                     break;
  420.  
  421.                 case GAD_QUIET_TRANSFER:
  422.  
  423.                     ConfigChanged = TRUE;
  424.  
  425.                     break;
  426.  
  427.                 case GAD_ABORT:
  428.  
  429.                     return(1);
  430.  
  431.                 case GAD_SKIP:
  432.  
  433.                     return(2);
  434.             }
  435.         }
  436.     }
  437.  
  438.     return(0);
  439. }
  440.